package socofwebget;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

//Para tentar arrancar automaticamente (INICIO)
import java.io.PrintWriter;
import org.apache.derby.drda.NetworkServerControl;
import javax.annotation.PostConstruct;
//Para tentar arrancar automaticamente (FIM)

// Local da instalacao do DERBY
//   /opt/Apache/db-derby-10.1.2.1-bin
// Local fisico da BD
//   /Users/tiagopereira/Documents/NetBeansProjects/SocofWebGet

//select * from SOCOF."FICHEIROS";
//
//insert into SOCOF."FICHEIROS" (FICHEIRO,ESTADO,TAMANHOSITE,CAMINHOSITE,CAMINHOLOCAL,NIVEIS,ACTUALIZADO)
//VALUES ('fx.teste.txt','NaoDescarregado','10',
//    'www.cenas.com/invencao','/home/teste/temp',3,'1994-02-23');
//insert into SOCOF."FICHEIROS" (FICHEIRO,ESTADO,TAMANHOSITE,CAMINHOSITE,CAMINHOLOCAL,NIVEIS,ACTUALIZADO)
//VALUES ('fx2.teste.txt','NaoDescarregado','11',
//    'www.cenas.com/invencao','/home/teste/temp',2,'2013-04-02');

/**
 *
 * @author tiagopereira
 */
public class DBAccess {

    // Registar driver JDBC
    private String driver = "org.apache.derby.jdbc.EmbeddedDriver";
    private String protocol = "jdbc:derby:";
    private String dbName = "socofWebGet";
    // Cada um usa a sua // private Connection conn = null;

    public void DBAccess(){
        //  Poderia ficar aqui o init, mas assim garante-se que o programador
        //nao se esquece de desligar.
    }
    
// Para arrancar automaticamente
    protected void init() {
        System.out.println("http://db.apache.org/derby/papers/DerbyTut/embedded_intro.html");
        try {
            Class.forName(driver).newInstance();
            
        } catch (java.lang.ClassNotFoundException e) {
            System.err.print("ClassNotFoundException: ");
            System.err.println(e.getMessage());
        } catch (Exception e) {
            System.out.println("Error loading ClientDriver");
                System.err.println("\n----- Class Exception ----- ");
                System.err.println("  Localized Message:  " + e.getLocalizedMessage());
                System.err.println("  Message: " + e.getMessage());
                System.err.println("  String:    " + e.toString());
                // for stack traces, refer to derby.log or uncomment this:
                e.printStackTrace(System.err);
        }
    }

// Para ligacao a BD    
    public Connection connection() {
        
        Connection conn = null;
        
        try {
            // DOIS DIAS À VOLTA DO LOCALHOST... PQ SOU BURRO!!! EMBEDDED NAO E LOCALHOST!!!
            // JDBC driver name e URL da BD
            //System.out.println("Metodo Connection");
            conn = DriverManager.getConnection(protocol + dbName + ";create=true", "SOCOF", "socof");
            //System.out.println("conn tem: " +conn.toString());
            //conn.close();
            //return conn;

        } catch (SQLException se) {
            
            if (se.getErrorCode() == 40000 && ("XJ040".equals(se.getSQLState())))
            {
                System.out.println("Base de dados ja arrancada 1");
                //shutdown();
                conn = connection();
                return conn;
//                try {
//                    System.out.println("Vou ter conn" + conn.toString());
//                    conn = DriverManager.getConnection(protocol);
//                    System.out.println("Tenho conn" + conn.toString());
//                } catch (SQLException ex) {
//                    //printSQLException(ex);
//                    Logger.getLogger(DBAccess.class.getName()).log(Level.SEVERE, null, ex);
//                }
            }
            if (se.getErrorCode() == 45000 && ("XSDB6".equals(se.getSQLState())))
            {
                System.out.println("Base de dados ja arrancada 2");
                conn = connection();
                return conn;
//                try {
//                    System.out.println("Vou ter conn" + conn.toString());
//                    conn = DriverManager.getConnection(protocol + dbName);
//                    System.out.println("Tenho conn" + conn.toString());
//                } catch (SQLException ex) {
//                    printSQLException(ex);
//                    Logger.getLogger(DBAccess.class.getName()).log(Level.SEVERE, null, ex);
//                }
            } 
            //printSQLException(se);
        } return conn;
    }

// Para desligar automaticamente
    public void shutdown() {
        try {
            //Desliga So a nossa BD:
            //DriverManager.getConnection(protocol + dbName +";shutdown=true", "SOCOF", "socof");
            //Desliga TODAS AS BD
            //DriverManager.getConnection(protocol + ";shutdown=true");
//            System.out.println("Metodo para fechar DB");
            DriverManager.getConnection(protocol + ";shutdown=true");
        } catch (SQLException se) {
            if (((se.getErrorCode() == 50000)
                    && ("XJ015".equals(se.getSQLState())))) {
                // Ora... Ca esta o que se almeja!!
                System.out.println("Derby shut down normally");
                // Note that for single database shutdown, the expected
                // SQL state is "08006", and the error code is 45000.
            } else {
                // if the error code or SQLState is different, we have
                // an unexpected exception (shutdown failed)
                System.err.println("Derby did not shut down normally");
                printSQLException(se);
            }
        }
    }

    public void criaTabelaOmissao(){
            String tabelaFxCriar = "FICHEIROS";
            String colunasFxCriar = "\"ID\" INTEGER not null "+
            "PRIMARY KEY GENERATED ALWAYS AS IDENTITY "+
            "(START WITH 1, INCREMENT BY 1), "+
            "\"DOMINIO\" VARCHAR(100), "+
            "\"FICHEIRO\" VARCHAR(100), "+
            "\"ESTADO\" VARCHAR(30), "+
            "\"TAMANHOSITE\" INTEGER, "+
            "\"CAMINHOSITE\" VARCHAR(250) not null, UNIQUE(\"CAMINHOSITE\"),"+
            "\"CAMINHOLOCAL\" VARCHAR(250)not null, UNIQUE(\"CAMINHOLOCAL\"),"+
            "\"TIPO\" VARCHAR(30), "+
            "\"NIVEIS\" INTEGER, "+
            "\"ACTUALIZADO\" date";
        
            DBAccess ligacao = new DBAccess();
            ligacao.init();

            ligacao.connection();
            ligacao.createTable(tabelaFxCriar, colunasFxCriar);
            ligacao.shutdown();
    }    
    
// Para apagar tabelas. Ja apanha erros e tudo
    public boolean deleteTable(String table) {
        boolean resultado = false;
        try {
            Connection ligacao = connection();
            Statement deletion = ligacao.createStatement();
            resultado=deletion.execute("DROP TABLE " + table.toUpperCase());
            deletion.close();
            ligacao.close();
        } catch (SQLException se) {
            if ((se.getErrorCode() == 30000) && ("42Y55".equals(se.getSQLState())))
            {
                System.out.println("Erro ao apagar: Tabela "+table.toUpperCase()+" nao existente");
            } else {
                System.err.println("Erro inesperado ao apagar a tabela");
                printSQLException(se);
            }
        }
        return resultado;
    }

// Para fazer um select recebido por argumento. Ja apanha erros e tudo
    public void sqlSelect(String sqlCommand){

        try {
        Connection ligacao = connection();
        Statement select = ligacao.createStatement();
        ResultSet result = select.executeQuery(sqlCommand);

        System.out.println("SQLSelect   :");
        while (result.next()) { // process results one row at a time
            String FICHEIRO = result.getString("FICHEIRO");
            String ESTADO = result.getString("ESTADO");

            System.out.println("FICHEIRO = " + FICHEIRO);
            System.out.println("ESTADO = " + ESTADO);
        }
        select.close();
        ligacao.close();
        } catch (SQLException se) {
            if ((se.getErrorCode() == 30000) && ("42X05".equals(se.getSQLState())))
            {
                System.out.println("Erro ao fazer SELECT: Tabela nao existente.");
            } else {
                System.err.println("Erro inesperado ao fazer SELECT.");
                printSQLException(se);
            }
        }
    }
    
// Para criar tabela com estrutura. Ja apanha erros e tudo
// Recebe no 1o argumento nome da tabela 
// Recebe no 2o argumento string de criacao das colunas
    public boolean createTable(String table, String columns) {
        boolean resultado = false;
        String tabela = table.toUpperCase();
        String create = "CREATE TABLE \""+ tabela +"\" ("+ columns+")";
//        System.out.println("Vou criar o seguinte: " + create);
        try {
            Thread.sleep(100);
        } catch (InterruptedException ex) {
            Logger.getLogger(SocofWebGet.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            Connection ligacao = connection();
            Statement creation = ligacao.createStatement();
            resultado=creation.execute(create);

            creation.close();
            ligacao.close();
        } catch (SQLException se) {
            se.printStackTrace();
        } catch (Exception e){
            System.out.println(e.toString());
        }
        return resultado;
    }

// Ja insere e trata erros conforme
    private int sqlFxInsert(Ficheiro dados) throws SQLException
    {
        boolean resultadoExecucao=false;
        int idResultante=-1;
        Connection ligacao = connection();
        String sqlInsertCommand = "Insert into \"FICHEIROS\" (" +
        "\"DOMINIO\", "+
        "\"FICHEIRO\", "+
        "\"ESTADO\", "+
        "\"TAMANHOSITE\", "+
        "\"CAMINHOSITE\", "+
        "\"CAMINHOLOCAL\", "+
        "\"TIPO\", "+
        "\"NIVEIS\", "+
        "\"ACTUALIZADO\") values ('" +
        dados.getDominio().toLowerCase() +"', '"+ dados.getFicheiro() +"', '"+
        dados.getEstado().toUpperCase()+"', "+ dados.getTamanhosite()+", '"+
        dados.getCaminhosite()+"', '"+dados.getCaminholocal()+"', '"+
        dados.getTipo().toUpperCase()+"', "+dados.getNiveis()+", CURRENT DATE)";
 //                dados.getTipo()+", "+dados.getNiveis()+", '"+dados.getActualizado()

        Statement insert = ligacao.createStatement();
        
        
        try {
            insert.executeUpdate(sqlInsertCommand, Statement.RETURN_GENERATED_KEYS);

            ResultSet resInsert = insert.getGeneratedKeys();
            resInsert.next();
            System.err.println("Apos insercao ficou com ID: " + resInsert.getInt(1));
            idResultante=resInsert.getInt(1);
            resultadoExecucao=true;
        } catch (SQLException se) {
            if (((se.getErrorCode() == 30000)
                    && ("23505".equals(se.getSQLState())))) {
                System.err.println("Registo duplicado. Nao foi possivel inserir.");
            } else {
                System.err.println("Outro erro ao inserir registo");
                printSQLException(se);
            }
        }
        if (!resultadoExecucao){
            System.err.println("Erro ao Inserir................ ");
            return idResultante;
        }
        System.out.println("Inserido com sucesso!!!!!!!!!!!!!!");
        return idResultante;
    }
    
//Se nao existir adiciona, se existir, actualiza
//EM QQE um dos casos, devolvera o id
// se id = -1 ERRO...
    public int writeData(Ficheiro dados)
    {
        System.out.println("Recebi fx com id: "+dados.getId());
        int resultado = -1;
        // Se nao existir, adiciona
        if ((dados.getId() == null)||(!sqlExisteId(dados)))
        {
            System.out.println("Vou Inserir");
            try {
                resultado=sqlFxInsert(dados);
            } catch (SQLException ex) {
                printSQLException(ex);
            }
        }
        // Se existir, actualiza
        else 
        {
            try {
                System.out.println("Vou actualizar");
                resultado = sqlFxUpdate(dados);
            } catch (SQLException ex) {
                printSQLException(ex);
            }            
        }
        return resultado;
    }
    
    
//Se nao existir adiciona, se existir, actualiza
//EM QQE um dos casos, devolvera o id
    public void writeData(ArrayList<Ficheiro> listaCompleta)
    {
       // int resultado=-1;

        for (Ficheiro ficheiro : listaCompleta) {
            writeData(ficheiro);
        }
//        if (resultado != -1)
//            return true;
//        else
//            return false;
    }
        
    
    
// Para actualizar existentes    
    private int sqlFxUpdate(Ficheiro dados) throws SQLException
    {
        boolean resultadoExecucao=false;
        int idExecutado=-1;
        Connection ligacao = connection();
        String sqlUpdateCommand = "UPDATE \"FICHEIROS\" set " +
        "\"DOMINIO\"= '"+dados.getDominio().toLowerCase()+
        "',\"FICHEIRO\"= '"+dados.getFicheiro()+
        "',\"ESTADO\"= '"+dados.getEstado().toUpperCase()+
        "',\"TAMANHOSITE\"= "+dados.getTamanhosite()+
        ",\"CAMINHOSITE\"= '"+dados.getCaminhosite()+
        "',\"CAMINHOLOCAL\"= '"+dados.getCaminholocal()+
        "',\"TIPO\"= '"+dados.getTipo().toUpperCase()+
        "',\"NIVEIS\"= "+dados.getNiveis()+
        ",\"ACTUALIZADO\"= CURRENT DATE " +
        "where \"ID\"="+ dados.getId();
        System.out.println(sqlUpdateCommand);
        Statement update = ligacao.createStatement();
        
        try {
            update.executeUpdate(sqlUpdateCommand, Statement.RETURN_GENERATED_KEYS);

//DEBUG
//            ResultSet resInsert = update.getGeneratedKeys();
//            resInsert.next();
//            System.err.println("Apos Actualizacao ficou com ID: " + resInsert.getInt(1));
//            idExecutado=resInsert.getInt(1);
            resultadoExecucao=true;
            idExecutado=dados.getId();
        } catch (SQLException se) {
            if (((se.getErrorCode() == 30000)
                    && ("23505".equals(se.getSQLState())))) {
                System.err.println("Registo duplicado. Nao actualizei.");
            } else {
                System.err.println("Outro erro ao actualizar registo");
                printSQLException(se);
            }
        }
        if (!resultadoExecucao){
            System.err.println("Erro ao actualizar valores................ ");
            return idExecutado;
        }
        System.out.println("Actualizado com sucesso!!!!!!!!!!!!!!");
        return idExecutado;
    }
    
// Para saber se já existe o ficheiro passando objecto
    public boolean sqlExisteId(Ficheiro dados)
    {
        boolean existencia = false;
        System.err.println("Vou testar se existe o ID "+dados.getId());
        if (dados.getId() == null){
            System.err.println("Recebi um in null em :"+dados.getFicheiro());
            return existencia;
        }
        try {
        Connection ligacao = connection();
        Statement select = ligacao.createStatement();
        ResultSet result = select.executeQuery("SELECT ID FROM \"FICHEIROS\" WHERE \"ID\"="
                +dados.getId());
        
        // System.out.println("TESTE PARA LISTAR TUDO E VER SE EXISTE ID");
        while (result.next()) { // processa resultados, um a um
            // System.out.println("Encontrado registo existente com ID: " + result.getInt(1));
            if (result.getInt(1)>0){
                existencia=true;
            }
        }
        select.close();
        ligacao.close();
        } catch (SQLException se) {
            if ((se.getErrorCode() == 30000) && ("42X05".equals(se.getSQLState())))
            {
                System.out.println("Erro ao fazer SELECT: Tabela nao existente.");
            } else {
                System.err.println("Erro inesperado ao fazer SELECT.");
                printSQLException(se);
            }
        }
        return existencia;
    }
// Para saber se já existe o ficheiro passando o ID
    public boolean sqlExisteId(int idFicheiro)
    {
        boolean existencia = false;
        System.out.println("Vou testar se existe por ID: "+idFicheiro);

        try {
        Connection ligacao = connection();
        Statement select = ligacao.createStatement();
        ResultSet result = select.executeQuery("SELECT ID FROM \"FICHEIROS\" WHERE \"ID\"="
                +idFicheiro);
        
        //System.out.println("TESTE PARA LISTAR TUDO E VER SE EXISTE ID");
        while (result.next()) { // processa resultados, um a um
            //System.out.println("Encontrado registo existente com ID: " + result.getInt(1));
            if (result.getInt(1)>0){
                existencia=true;
            }
        }
        select.close();
        ligacao.close();
        } catch (SQLException se) {
            if ((se.getErrorCode() == 30000) && ("42X05".equals(se.getSQLState())))
            {
                System.err.println("Erro ao fazer SELECT: Tabela nao existente.");
            } else {
                System.err.println("Erro inesperado ao fazer SELECT.");
                printSQLException(se);
            }
        }
        return existencia;
    }

// Para devolver Array com lista de todos os FX do dominio    
    public ArrayList<Ficheiro> getByDomain(String dominio){
        ArrayList<Ficheiro> lista = new ArrayList<Ficheiro> ();
        
        try {
        Connection ligacao = connection();
        Statement select = ligacao.createStatement();
        ResultSet result = select.executeQuery("SELECT * from \"FICHEIROS\""+
                "where \"DOMINIO\" = '"+dominio+"'");

        
        System.out.println("Get tudo do dominio :" + dominio);
        while (result.next()) { // process results one row at a time
            Ficheiro fx = new Ficheiro(
                    result.getInt("ID"),
                    result.getString("DOMINIO"),
                    result.getString("FICHEIRO"),
                    result.getString("ESTADO"),
                    result.getLong("TAMANHOSITE"),
                    result.getString("CAMINHOSITE"),
                    result.getString("CAMINHOLOCAL"),
                    result.getString("TIPO"),
                    result.getInt("NIVEIS"),
                    result.getDate("ACTUALIZADO")
                    );
                    lista.add(fx);
        }
        select.close();
        ligacao.close();
        } catch (SQLException se) {
            if ((se.getErrorCode() == 30000) && ("42X05".equals(se.getSQLState())))
            {
                System.out.println("Erro ao fazer SELECT: Tabela nao existente.");
            } else {
                System.err.println("Erro inesperado ao fazer SELECT.");
                printSQLException(se);
            }
        }
        
        return lista;
    }    

// Para devolver Array com lista de todos os fx INCOMPLETO do dominio    
    public ArrayList<Ficheiro> getIncompleteByDomain(String dominio){
        ArrayList<Ficheiro> lista = new ArrayList<Ficheiro> ();
        String estado = "INCOMPLETO";
        
        try {
        Connection ligacao = connection();
        Statement select = ligacao.createStatement();
        ResultSet result = select.executeQuery("SELECT * from \"FICHEIROS\""+
                "where \"DOMINIO\" = '"+dominio+"' and ESTADO = '"
                + estado.toUpperCase()+"'");

        
        System.out.println("Get "+estado+" do dominio :" + dominio);
        while (result.next()) { // process results one row at a time
            Ficheiro fx = new Ficheiro(
                    result.getInt("ID"),
                    result.getString("DOMINIO"),
                    result.getString("FICHEIRO"),
                    result.getString("ESTADO"),
                    result.getLong("TAMANHOSITE"),
                    result.getString("CAMINHOSITE"),
                    result.getString("CAMINHOLOCAL"),
                    result.getString("TIPO"),
                    result.getInt("NIVEIS"),
                    result.getDate("ACTUALIZADO")
                    );
                    lista.add(fx);
        }
        select.close();
        ligacao.close();
        } catch (SQLException se) {
            if ((se.getErrorCode() == 30000) && ("42X05".equals(se.getSQLState())))
            {
                System.out.println("Erro ao fazer SELECT: Tabela nao existente.");
            } else {
                System.err.println("Erro inesperado ao fazer SELECT.");
                printSQLException(se);
            }
        }
        
        return lista;
    }

// Para devolver Array com lista de todos os fx COMPLETO do dominio    
    public ArrayList<Ficheiro> getCompleteByDomain(String dominio){
        ArrayList<Ficheiro> lista = new ArrayList<Ficheiro> ();
        String estado = "COMPLETO";
        
        try {
        Connection ligacao = connection();
        Statement select = ligacao.createStatement();
        ResultSet result = select.executeQuery("SELECT * from \"FICHEIROS\""+
                "where \"DOMINIO\" = '"+dominio+"' and ESTADO = '"
                + estado.toUpperCase()+"'");

        
        System.out.println("Get "+estado+" do dominio :" + dominio);
        while (result.next()) { // process results one row at a time
            Ficheiro fx = new Ficheiro(
                    result.getInt("ID"),
                    result.getString("DOMINIO"),
                    result.getString("FICHEIRO"),
                    result.getString("ESTADO"),
                    result.getLong("TAMANHOSITE"),
                    result.getString("CAMINHOSITE"),
                    result.getString("CAMINHOLOCAL"),
                    result.getString("TIPO"),
                    result.getInt("NIVEIS"),
                    result.getDate("ACTUALIZADO")
                    );
                    lista.add(fx);
        }
        select.close();
        ligacao.close();
        } catch (SQLException se) {
            if ((se.getErrorCode() == 30000) && ("42X05".equals(se.getSQLState())))
            {
                System.out.println("Erro ao fazer SELECT: Tabela nao existente.");
            } else {
                System.err.println("Erro inesperado ao fazer SELECT.");
                printSQLException(se);
            }
        }
        
        return lista;
    }
    
// Para devolver Array com lista de todos os fx do dominio conforme ESTADO passado    
    public ArrayList<Ficheiro> getByDomainStatus(String dominio, String status){
        ArrayList<Ficheiro> lista = new ArrayList<Ficheiro> ();
        String estado = status.toUpperCase();
        
        try {
        Connection ligacao = connection();
        Statement select = ligacao.createStatement();
        ResultSet result = select.executeQuery("SELECT * from \"FICHEIROS\""+
                "where \"DOMINIO\" = '"+dominio+"' and ESTADO = '"
                + estado+"'");

        
        System.out.println("Get "+estado+" do dominio :" + dominio);
        while (result.next()) { // process results one row at a time
            Ficheiro fx = new Ficheiro(
                    result.getInt("ID"),
                    result.getString("DOMINIO"),
                    result.getString("FICHEIRO"),
                    result.getString("ESTADO"),
                    result.getLong("TAMANHOSITE"),
                    result.getString("CAMINHOSITE"),
                    result.getString("CAMINHOLOCAL"),
                    result.getString("TIPO"),
                    result.getInt("NIVEIS"),
                    result.getDate("ACTUALIZADO")
                    );
                    lista.add(fx);
        }
        select.close();
        ligacao.close();
        } catch (SQLException se) {
            if ((se.getErrorCode() == 30000) && ("42X05".equals(se.getSQLState())))
            {
                System.out.println("Erro ao fazer SELECT: Tabela nao existente.");
            } else {
                System.err.println("Erro inesperado ao fazer SELECT.");
                printSQLException(se);
            }
        }
        
        return lista;
    }    
   
// Devolve um unico ficheiro conforme o id
    public Ficheiro getFicheiro (int id)
    {
        Ficheiro fx=null;
        
        try {
        Connection ligacao = connection();
        Statement select = ligacao.createStatement();
        ResultSet result = select.executeQuery("SELECT * from \"FICHEIROS\""+
                "where \"ID\" = "+id+"");

        
        System.out.println("Get tudo do Ficheiro com id :" + id);
        while (result.next()) { // process results one row at a time
             fx = new Ficheiro(
                    result.getInt("ID"),
                    result.getString("DOMINIO"),
                    result.getString("FICHEIRO"),
                    result.getString("ESTADO"),
                    result.getLong("TAMANHOSITE"),
                    result.getString("CAMINHOSITE"),
                    result.getString("CAMINHOLOCAL"),
                    result.getString("TIPO"),
                    result.getInt("NIVEIS"),
                    result.getDate("ACTUALIZADO")
                    );
         }
        select.close();
        ligacao.close();
        } catch (SQLException se) {
            if ((se.getErrorCode() == 30000) && ("42X05".equals(se.getSQLState())))
            {
                System.out.println("Erro ao fazer SELECT: Tabela nao existente.");
            } else {
                System.err.println("Erro inesperado ao fazer SELECT.");
                printSQLException(se);
            }
        }
        
        return fx;
    }
     
    
    
////////////////////////////////////   
//  EM INVESTIGACAO A PARTIR DAQUI
////////////////////////////////////

    // Devolver Ficheiro por estado por dominio devolve string com caminho completo
    // Devolver id
    // Devolver URL por id

    // Actualizar estado por id
    // 
    // FAZER LOCKS A BD PARA TODAS AS OPERACOES DE ESCRITA
    // http://db.apache.org/derby/docs/10.0/manuals/develop/develop75.html#HDRSII-CONCEPTS-16400

    // Devolver Ficheiro por estado por dominio devolve string com caminho completo        

    
    
    
    
    
    public void sqlAlter(String sqlCommand) throws SQLException {

        Connection ligacao = connection();
        Statement alter = ligacao.createStatement();
        ResultSet result = alter.executeQuery(sqlCommand);

        System.out.println("Got results from Embedded   :");
        while (result.next()) { // process results one row at a time
            String FICHEIRO = result.getString(1);
            String ESTADO = result.getString(2);

            System.out.println("FICHEIRO = " + FICHEIRO);
            System.out.println("ESTADO = " + ESTADO);
        }
        alter.close();
        ligacao.close();
    }
    
    // Para tratamento de Excepcoes SQL
    public static void printSQLException(SQLException e) {
        // Abre a SQLException e mostra o que se passou
        while (e != null) {
            System.err.println("\n----- SQLException -----");
            System.err.println("  SQL State:  " + e.getSQLState());
            System.err.println("  Error Code: " + e.getErrorCode());
            System.err.println("  Message:    " + e.getMessage());
            // for stack traces, refer to derby.log or uncomment this:
            //e.printStackTrace(System.err);
            e = e.getNextException();
        }
    }
}
